// 导入设备存储管理器
import { useDeviceStore } from '$/store'

// 导入一个实用工具，用于处理多个Promise的执行结果
import { allSettledWrapper } from '$/utils'

// 导入Element Plus的消息提示组件
import { ElMessage } from 'element-plus'

/**
 * 导出一个用于执行安装操作的钩子函数
 * 该函数提供了设备上安装文件所需的功能，包括单个设备和多个设备的安装
 */
export function useInstallAction() {
  // 初始化设备存储管理器
  const deviceStore = useDeviceStore()

  // 创建一个响应式的loading状态，用于UI展示
  const loading = ref(false)

  /**
   * 根据传入参数的不同，调用单个设备安装或多个设备安装函数
   * @param {Array|Object} ...args - 可变参数，第一个参数为设备或设备数组
   * @returns {Promise} - 安装操作的Promise对象
   */
  function invoke(...args) {
    const [devices] = args

    // 判断第一个参数是否为数组，以决定调用单个设备还是多个设备的安装函数
    if (Array.isArray(devices)) {
      return multipleInvoke(...args)
    }

    return singleInvoke(...args)
  }

  /**
   * 弹出文件选择对话框，让用户选择要安装的文件
   * @returns {Promise<Array>} - 选定的文件路径数组
   */
  async function selectFiles() {
    try {
      // 调用Electron的IPC渲染进程方法，显示文件选择对话框
      const files = await window.electron.ipcRenderer.invoke(
        'show-open-dialog',
        {
          properties: ['openFile', 'multiSelections'],
          filters: [
            {
              name: window.t('device.control.install.placeholder'),
              extensions: ['apk'],
            },
          ],
        },
      )

      return files
    }
    catch (error) {
      // 处理文件选择过程中的错误
      const message = error.message?.match(/Error: (.*)/)?.[1] || error.message
      throw new Error(message)
    }
  }

  /**
   * 对单个设备执行安装操作
   * @param {Object} device - 设备对象
   * @param {Object} options - 选项对象
   * @param {Array} options.files - 要安装的文件路径数组
   * @param {boolean} [options.silent=false] - 是否静默安装，不显示加载提示
   * @returns {Promise<boolean>} - 安装操作的结果，始终返回false
   */
  async function singleInvoke(device, { files, silent = false } = {}) {
    // 如果没有提供文件，则调用文件选择对话框让用户选择
    if (!files) {
      try {
        files = await selectFiles()
      }
      catch (error) {
        // 处理文件选择过程中的错误
        ElMessage.warning(error.message)
        return false
      }
    }

    let closeLoading = null
    // 如果不是静默安装，显示加载提示
    if (!silent) {
      closeLoading = ElMessage.loading(
        window.t('device.control.install.progress', {
          deviceName: deviceStore.getLabel(device),
        }),
      ).close
    }

    let failCount = 0

    // 使用allSettledWrapper并行安装每个文件，并统计失败次数
    await allSettledWrapper(files, (item) => {
      return window.adbkit.install(device.id, item).catch((e) => {
        console.warn(e)
        ++failCount
      })
    })

    // 如果是静默安装，直接返回
    if (silent) {
      return false
    }

    // 关闭加载提示
    closeLoading()

    // 计算总文件数和成功安装数
    const totalCount = files.length
    const successCount = totalCount - failCount

    // 根据安装结果显示不同的消息提示
    if (successCount) {
      if (totalCount > 1) {
        ElMessage.success(
          window.t('device.control.install.success', {
            deviceName: deviceStore.getLabel(device),
            totalCount,
            successCount,
            failCount,
          }),
        )
      }
      else {
        ElMessage.success(
          window.t('device.control.install.success.single', {
            deviceName: deviceStore.getLabel(device),
          }),
        )
      }
      return false
    }

    // 如果所有安装都失败，显示警告消息
    ElMessage.warning(window.t('device.control.install.error'))
  }

  /**
   * 对多个设备执行安装操作
   * @param {Array} devices - 设备数组
   * @param {Object} options - 选项对象
   * @param {Array} options.files - 要安装的文件路径数组
   * @returns {Promise} - 安装操作的Promise对象
   */
  async function multipleInvoke(devices, { files } = {}) {
    // 如果没有提供文件，则调用文件选择对话框让用户选择
    if (!files) {
      try {
        files = await selectFiles()
      }
      catch (error) {
        // 处理文件选择过程中的错误
        ElMessage.warning(error.message)
        return false
      }
    }

    // 设置loading状态为true
    loading.value = true

    // 显示加载提示
    const closeMessage = ElMessage.loading(
      window.t('device.control.install.progress', {
        deviceName: window.t('common.device'),
      }),
    ).close

    // 使用allSettledWrapper并行对每个设备执行安装操作
    await allSettledWrapper(devices, (item) => {
      return singleInvoke(item, {
        files,
        silent: true,
      })
    })

    // 关闭加载提示
    closeMessage()

    // 显示批量安装成功的消息
    ElMessage.success(window.t('common.success.batch'))

    // 重置loading状态为false
    loading.value = false
  }

  // 返回安装操作相关的函数和状态
  return {
    invoke,
    loading,
    deviceStore,
    selectFiles,
    multipleInvoke,
    singleInvoke,
  }
}

// 默认导出useInstallAction函数
export default useInstallAction
